package ai.genetic;

/**
 * An Individual for a genetic algorithm
 *
 * @param <O> Type of individual to enforce the fact that different types cant be used together.
 */
public interface Individual<O extends Object>
{
    /**
     * actual underlying object, most often will be this but it could also be a wrapper class
     *
     * @return underlying data object
     */
    public O getObject();

    /**
     * Cross over operation
     *
     * @param partner
     * @return
     */
    public Individual<O> crossover(Individual<O> partner);


    public void mutate();
}
